public class Solution2379 {
    public int minimumRecolors(String blocks, int k) {
        int len = blocks.length();

        // 预处理
        int[] nums = new int[len];
        for (int i = 0; i < len; i++) {
            if (blocks.charAt(i) == 'B') {
                nums[i] = 1;
            }
        }
        // 前缀和
        int[] preSum = new int[len + 1];
        for (int i = 0; i < len; i++) {
            preSum[i + 1] = preSum[i] + nums[i];
        }

        // 贪心
        int max = 0;
        for (int i = k - 1; i < len; i++) {
            max = Math.max(max, preSum[i + 1] - preSum[i + 1 - k]);
        }
        return k - max;
    }
}
/*
2379. 得到 K 个黑块的最少涂色次数
https://leetcode.cn/problems/minimum-recolors-to-get-k-consecutive-black-blocks/

第 85 场双周赛 T1。

给你一个长度为 n 下标从 0 开始的字符串 blocks ，blocks[i] 要么是 'W' 要么是 'B' ，表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。
给你一个整数 k ，表示想要 连续 黑色块的数目。
每一次操作中，你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。
提示：
n == blocks.length
1 <= n <= 100
blocks[i] 要么是 'W' ，要么是 'B' 。
1 <= k <= n

前缀和 + 贪心
时间复杂度 O(n)
 */